#include "mywidget.h"
#include <QPushButton>
#include <QDebug>//打印头文件，打印方式和C++中的类似

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{
    setWindowTitle("测试窗口");
    resize(400, 300);//指定窗口大小
    b1.setParent(this);//指定父关系
    b1.setText("close");//设置按键内容
    b1.move(100,100);//移动按键坐标

    b2 = new QPushButton(this);//
    b2->setText("###");

    //信号与槽
    //对于b1按键按下b1的时候关闭窗口
    connect(&b1, &QPushButton::pressed, this, &MyWidget::close);

    //对于b2按下b2后抬起，改变b2按键的内容
    //使用自定义槽函数
    connect(b2, &QPushButton::released,this,  &MyWidget::changeWin1);

    setWindowTitle("老大");
    b3.setParent(this);
    b3.setText("切换到小弟窗口");
    b3.move(50, 50);

    //切换到小弟窗口
    connect(&b3,&QPushButton::released, this, &MyWidget::exChange);
    //w.show();

    //切换到老大窗口
    //由于小弟窗口无法调用到老大的W才操作老大的窗口
    //所以小弟只能向老大发送一个信号来征求老大的意见，所以小弟要自定义一个信号
    //向老大发送信号
    //connect(&w, &subWidget::mySignal, this, &MyWidget::exec);

    //为了区分重载的信号，Qt5经常使用函数指针来直接指向匹配的信号，并注意函数指针要指定作用域
    void (subWidget::*noFunc)() = &subWidget::mySignal;
    connect(&w, noFunc, this, &MyWidget::Noexec);

    void (subWidget::*hanvFunc)(int, QString) = &subWidget::mySignal;
    connect(&w, hanvFunc, this, &MyWidget::Havexec);

    //在Qt4中使用的方式有点不一样，槽函数必须要有slots关键字修饰
    //但是Qt4中SIGNAL SLOT会直接吧函数名转化为字符串不会进行错误检查
    //所以不建议使用Qt4的写法

    //Lambda表达式，匿名函数对象
    //C++11增加的特性，项目文件加上：CONFIG += C++11；
    //与Qt的信号配合使用

    QPushButton* b4 = new QPushButton(this);
    b4->setText("Lambda");
    b4->move(150, 150);

    //一旦收到信号直接调用{}里面的内容
    //connect(b4, &QPushButton::released,//信号没有参数的时候
    connect(b4, &QPushButton::clicked,//信号有参数
            //[]中可也可以传递参数，[]的作用就是吧外部变量传递过来，只要传递了参数（这里是值传递），就可以在{}里面使用，
            //[=]这样写就是将外部所有局部变量，类中所有成员以值的方式传递
            //以值的方式传递过来默认是只读的不可以修改。
            //后面加上关键字mutable就可以修改了
            //[&]:这种就是将外部所有局部变量不包括类中的成员以引用的方式传进去
    [=](bool isChick)//如果信号有参数，可以接收信号的参数
    {
        qDebug() << "11111";
        qDebug() << isChick;
    }
            );
}

void MyWidget::changeWin1()
{
    b2->setText("***");
}
void MyWidget::exChange()
{
    //隐藏老大窗口，显示小弟窗口
    hide();

    w.show();
}

void MyWidget::Noexec()
{
    //隐藏小弟，显示老大窗口
    w.hide();
    show();
}

void MyWidget::Havexec(int a, QString str)
{
    //有时候因为字符编码问题，需要进行编码的转换，
    //toUtf8() --> 字节数组QByteArray
    //……data() -->  QByteArray --> char*
    qDebug() << a << str.toUtf8().data();
}

MyWidget::~MyWidget()
{
}

